#include "Pais.h"
#include "CastIterador.h"
Pais::Pais(Cadena nombre,int MaxCiudades)
{
	cantidadCiudades=0;
	Puntero<FuncionIguales<Cadena>> fi=new FuncionIgualesCadena();
	m_Nombre = nombre;
	Puntero<FuncionHash<Cadena>> fh1=new CadenaFuncionHash(MaxCiudades);
	m_Ciudades=new AVLImp<Puntero<Ciudad>>();
	this->hashCiudades=new Hash<Cadena,Puntero<Ciudad>>(fh1,fi,MaxCiudades);
	m_Capital = new Ciudad("Sin Nombre",false,0,"");
	this->riquezaRecursos=0;
}

Pais::~Pais()
{
	this->hashCiudades=NULL;
	this->m_Ciudades=NULL;
	this->m_Capital=NULL;
}

Cadena Pais::ObtenerNombre() const
{
	return m_Nombre;
}

int Pais::CantidadCiudades() const
{
	return this->cantidadCiudades;
}

Puntero<AVLImp<Puntero<Ciudad>>>  Pais::ObtenerCiudades() const
{
	return this->m_Ciudades;
}
void Pais::SetCapital(Puntero<Ciudad> c)
{
	this->m_Capital=c;

}

pCiudad Pais::ObtenerCapital() const
{
	return m_Capital.Cast<ICiudad>();
}
bool Pais::tieneCapital(){
	if(m_Capital->ObtenerNombre()=="Sin Nombre"){
		return false;
	}else{
	return true;
	}
}
Puntero<Iterador<pCiudad>> Pais::Ciudades() const 
{
	this->m_Ciudades->CrearIterador();
	Puntero<Iterador<Puntero<Ciudad>>> it= this->m_Ciudades->ObtenerIterador();
	Puntero<Iterador<pCiudad>> it2=  new CastIterador<Ciudad,ICiudad>(it);
	return it2;

}
//void Pais::SetCiudades(Array<Puntero<Ciudad>> ciudades, Puntero<Ciudad> capital)
//{
//	m_Ciudades = ciudades;
//	m_Capital = capital;
//}
void Pais::sumarCiudad()
{
	this->cantidadCiudades=this->cantidadCiudades+1;
}
Puntero<Hash<Cadena,Puntero<Ciudad>>> Pais::ObtenerHashCiudades() const
{
	return this->hashCiudades;
}
bool Pais::operator==(const Pais& p) const
{
	return this->m_Nombre!=p.m_Nombre;
}
bool Pais::operator!=(const Pais& p) const
{
	return this->m_Nombre==p.m_Nombre;
}
bool Pais::operator<(const Pais& p) const
{
	return this->m_Nombre<p.m_Nombre;
}
bool Pais::operator>(const Pais& p) const
{
	return this->m_Nombre>p.m_Nombre;
}
bool Pais::operator<=(const Pais& p) const
{
	return this->m_Nombre<=p.m_Nombre;
}
bool Pais::operator>=(const Pais& p) const
{
	return this->m_Nombre>=p.m_Nombre;
}
ostream& operator<<(ostream& out, const Pais& p)
{
	return cout<<p.m_Nombre<<endl;
}
int Pais::CalcularRiqueza(){
	int recCiudad=0;
	this->ObtenerCiudades()->CrearIterador(); 
	Puntero<Iterador<Puntero<Ciudad>>> it=this->ObtenerCiudades()->ObtenerIterador();
	while(it->HayElemento()){
		Puntero<Ciudad> ciu =it->ElementoActual();
		Puntero<Iterador<Puntero<Recurso>>> it1=ciu->ObtenerRecurso()->ObtenerIterador();
		while(it1->HayElemento()){
			Puntero<Recurso> rec=it1->ElementoActual();
			recCiudad=recCiudad+(rec->ObtenerValor()*rec->ObtenerCantidad());
			it1->Avanzar();
		}
		this->riquezaRecursos=this->riquezaRecursos+recCiudad;
		recCiudad=0;
		it->Avanzar();
	}
	return this->riquezaRecursos;
}